#pragma once
#include <stdio.h>
#include <string>

#define MAX_LISTEN 1024

class Socket
{
private:
    int _sockfd;

public:
    Socket();
    Socket(int fd);
    // 1. 返回当前文件描述符
    int Fd();

    // 2. 关闭套接字文件描述符
    void Close();

    // 3. 创建套接字
    bool Create();

    // 4. 绑定地址信息
    bool Bind(const std::string &ip, uint16_t port);

    // 5. 监听套接字
    bool Listen(int backlog = MAX_LISTEN);

    // 6. 发起连接
    bool Connect(const std::string &ip, uint16_t port);

    // 7. 获取新链接
    int Accept();

    // 8. 接收数据
    ssize_t Recv(void *buffer, size_t len, int flag = 0);
    ssize_t NonBlockRecv(void *buffer, size_t len);

    // 9. 发送数据
    ssize_t Send(const void *buffer, size_t len, int falg = 0);
    ssize_t NonBlockSend(void *buffer, size_t len);

    // 10. 创建一个服务器连接
    bool CreateServer(uint16_t port, const std::string &ip = "0.0.0.0", bool block_flag = false);

    // 11. 创建一个客服端连接
    bool CreateClient(uint16_t port, const std::string ip);

    // 12. 设置套接字选项 -- 开启端口复用
    void ReuseAddress();

    // 13. 设置套接字阻塞属性 -- 设置为非阻塞
    void NonBlock();
    ~Socket();
};
